package xin.ukey.common.utils;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 描述：字符转换工具类
 *
 * @author ssl
 * @create 2017/10/30 15:45
 */
public class CharacterConvert {

    /**
     * 匹配所有由1或0组成的8位字符
     */
    private static Pattern pattern = Pattern.compile("[10]{8}");

    public static void main(String[] args) {
        String source = "施森林";
        String binary = chineseToBinary(source);
        System.out.println(MessageFormat.format("[{0}]转换为二进制后为[{1}]", source, binary));
        String binaryResult = binary;
        String chineseSource = binaryToString(binaryResult);
        System.out.println(MessageFormat.format("[{0}]转换为汉字后为[{1}]", binaryResult, chineseSource));

    }

    /**
     * 将二进制转换为字符串
     *
     * @param source
     * @return
     */
    public static String binaryToString(String source) {
        /** 定义正则表达式 */
        /** 定义匹配器，与源字符关联上 */
        Matcher matcher = pattern.matcher(source);
        /** 安放匹配结果 */
        List list = new ArrayList();
        /** 开始搜寻pattern,先将8位的字符串按2进制扫描为Integer,由于后面的须求数字再强制转成byte,存入list中 */
        while (matcher.find()) {
            list.add((byte) Integer.parseInt(matcher.group(), 2));
        }
        /** 准备将list转为byte数组,由于String构造器参数类型的限制 */
        byte[] b = new byte[list.size()];
        /** 开始转换 */
        for (int j = 0; j < b.length; j++) {
            b[j] = (Byte) list.remove(0);
        }
        /** List.remove(int index)是将指定位置的元素删除, 然后右边所有剩下的数据向左移一位，填补第一个数据的空缺。
         * remove(0)中0表示第一个元素，不停的调用remove(0)导致所有元素被删光，剩下一个空集合。
         * 除了删除指定元素外，同时也具有返回值，就是被删掉的元素。 */
        return new String(b);
    }

    /**
     * 汉字转换为二进制
     *
     * @param source
     * @return
     */
    public static String chineseToBinary(String source) {
        StringBuffer result = new StringBuffer();
        byte[] bytes;
        try {
            bytes = source.getBytes("UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        for (int i = 0; i < bytes.length; i++) {
            result.append(Integer.toBinaryString(bytes[i] & 0xff));
        }
        return result.toString();
    }
}
